데이터 타입
질문 List
데이터 타입 🔥
- 데이터 타입의 종류는 어떤 것들이 있나요? 🔥
- 심벌 타입은 뭐죠?
- 데이터 타입은 왜 필요할까요? 🔥
- 정적 타이핑이 뭔가요?
- 동적 타이핑이 뭔가요?
질문 & 정답 List
데이터 타입 🔥
1. 데이터 타입의 종류는 어떤 것들이 있나요? 🔥
- Javascript는 느슨한 타입의 동적 언어. 즉, 어떤 특정 타입과 연결되지 않으며 모든 타입의 값으로 할당 가능
- 변수의 타입 지정 없이 값이 할당되는 과정에서 자동으로 데이터 타입이 결정됨
- Javascript 데이터 타입에는 크게 두 가지가 있습니다.
- Primitive Type(원시 타입) : 불변값
Boolean- falsy 값 : null, undefined, 0
Number- 2진수, 8진수, 16진수 데이터 타입 제공 X. 이들 값을 참조하면 모두 10진수로 해석
- 정수만을 위한 타입이 없고 모두 실수 처리
- 특별한 값 : Infinity, -Infinity, NaN
String- read only로, 문자열 생성 후 바꿀 수 없음
let str = "Hello";
str[0] = "h";
console.log(str); // Hello- 0개 이상의 16bit 유니코드(UTF-16)들의 집합
- 대부분의 전세계의 문자 표현 가능
- 유사 배열 : 배열처럼 인덱스를 통해 접근 가능
- 재할당 불가. 기존 문자열을 변경하는 것이 아니라, 새로운 문자열을 새롭게 할당하는 것
null- 메모리 어드레스의 참조 정보를 제거하는 것을 의미
Undefined- 선언 및 초기화 이후 값이 할당되지 않은 변수가 갖는 값
- 개발자가 의도적으로 할당하기 위한 값이 아니라, JS 엔진이 변수를 초기화할 때 사용하는 값
Symbol- 고유하고 변경 불가능한 원시 값이며, 객체의 속성 키로 사용 가능
BigInt: Number의 최대값(2^53 - 1) 보다 큰 정수를 표현하기 위한 타입- 정수 끝에 n을 추가하거나 생성자를 호출해 생성 가능
- Number와 혼합해 연산 불가. TypeError 발생
- Object Type(객체 타입)
- 데이터(프로퍼티)와 그 데이터에 관련한 동작(메소드)을 모두 포함할 수 있는 개념적 존재
- 원시 타입을 제외한 모든 것은 모두 객체
- e.g.
Object,Array,Function,RegExp,Date,Math,JSON - pass-by-reference(참조에 의한 전달) 방식으로 전달
- Primitive Type(원시 타입) : 불변값
2. 심벌 타입은 뭐죠?
- 변경 불가능한 원시 값
- 매 번 새로운(고유한) 심볼 생성
- new 연산자를 이용(생성자)한 래퍼 객체 생성 불가
const symbol1 = Symbol("foo");
const symbol2 = Symbol("foo");
console.log(symbol1 === symbol2); // false
심볼은 주로 객체의 프로퍼티 키로 사용
- 객체의 키는 대게 문자열(숫자도 문자열로 변환됨)
const obj = {};
const foo = Symbol("foo");
obj[foo] = "bar";
console.log(obj); // { [Symbol(foo)]: 'bar' }내장 심볼
- 특별한 용도로 사용되기 위해 JS 엔진 내에 미리 생성되어 상수로 존재하고 있는 내장 심볼
- Symbol 함수의 프로퍼티로서 존재
- 대표적인 Symbol.iterator : 이터레이터를 반환하는 함수 값
- 이터레이터 : 순회 가능한 자료 구조(for..of문,map 등)의 요소를 탐색하기 위한 포인터
2. 데이터 타입은 왜 필요할까요? 🔥
- 값을 지정할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위하여
- 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위하여
- 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위하여
3. 정적 타이핑이 뭔가요?
- 자료형 검사가 컴파일 타임 동안 진행. 즉, 변수의 자료형을 사전에 지정해야 함
- e.g. C, C++, JAVA
- 진행 속도 빠름
- type eorr로 인한 문제점 초기에 발견
4. 동적 타이핑이 뭔가요?
- 자료형 검사가 런타임 동안 진행. 즉, 변수의 자료형을 사전에 지정하지 않아도 됨
- e.g. python, Javascript
- 상대적으로 편함
- 런타임 도중 예상치 못한 에러 발생할 수 있음
- 진행 속도가 느림
- 한 줄 씩 순서대로 기계어로 번역함
궁금증 : 선언, 초기화, 할당 단계가 무엇인가요?
- 선언 단계 : 변수 객체에 변수를 등록
- 이 변수 객체는 스코프가 참조하는 대상이 된다.
- 초기화 단계 : 변수 객체에 등록된 변수를 메모리에 할당
- 이 단계에서 변수는 undefined로 초기화된다.
- 할당 단계 : undefined로 초기화된 변수에 실제값을 할당한다.
궁금증 : compile vs runtime
compile: 소스 코드를 작성하고 기계어 코드로 변환되어 실행 가능한 프로그램이 되는 과정- compile error : syntex error, type error
- syntex error : 문법에 맞지 않는 코딩을 했을 경우 발생 e.g. 괄호 누락
- type error : 타입에 맞지 않는 코딩을 했을 경우 발생 e.g. 문자열에 숫자를 더하기
- VS Code에서 빨간줄로 표시됨
- compile error : syntex error, type error
runtime: 응용프로그램이 동작되어지는 때- runtime error : 0나누기 error, null 참조 error, memory 부족 error
- compile 중에는 감지하지 못하는 에러들
- runtime error : 0나누기 error, null 참조 error, memory 부족 error
궁금증 : compile vs interpret
compile: programming language를 Runtime 전에 컴퓨터가 알아들을 수 있는 언어(기계어)로 해석- Compiler 언어 : 소스코드 전체를 한 번 훑어 컴퓨터가 실행할 수 있도록 바로 기계어로 변환
- 전체 소스코드를 변환 후 에러 보고
- e.g. C, C++, JAVA
- Compiler 언어 : 소스코드 전체를 한 번 훑어 컴퓨터가 실행할 수 있도록 바로 기계어로 변환
interpret: Runtime 이후 Row 단위로 해석해 프로그램 구동- Interpreter 언어 : Intermediate Code로 변환하고 이를 각 행마다 실행
- 각 행마다 확인해 에러가 발생되면 즉시 중단 후 에러 보고
- e.g. Python, Javascript
- Interpreter 언어 : Intermediate Code로 변환하고 이를 각 행마다 실행
궁금증 : JS는 컴파일 단계가 없는가?
- JS는 전통적으로 인터프리터 언어. 웹 브라우저에서 즉시 실행되도록 설계
- but JS엔진은 인터프리팅과 컴파일링 사이의 다양한 기술 사용
- V8같은 현대적인 JS엔진은 JIT(Just In Time)컴파일을 사용하여 코드를 최적화.
- JIT : 실행 시간 동안 코드를 기계어로 컴파일하는 프로세스 => 컴파일 단계 존재
- TS를 JS로 컴파일
- Babel을 이용하여 최신 JS를 지원하지 않는 브라우저에서도 실행될 수 있게 JS 코드 변환